package common

import (
	"github.com/k0kubun/pp"
	"math"
	"regexp"
	"strings"

	"github.com/duke-git/lancet/v2/random"
	"github.com/gookit/goutil/dump"

	"gin-api-server/core_library/global"
)

func GetDistance(lat1, lat2, lng1, lng2 float64) float64 {
	radius := 6371000.0 // 6378137.0
	rad := math.Pi / 180.0
	lat1 = lat1 * rad
	lng1 = lng1 * rad
	lat2 = lat2 * rad
	lng2 = lng2 * rad
	theta := lng2 - lng1
	dist := math.Acos(math.Sin(lat1)*math.Sin(lat2) + math.Cos(lat1)*math.Cos(lat2)*math.Cos(theta))
	return dist * radius / 1000
}

func CheckMobile(phone string) bool {
	// 匹配规则
	// ^1第一位为一
	// [345789]{1} 后接一位345789 的数字
	// \\d \d的转义 表示数字 {9} 接9位
	// $ 结束符
	regRuler := "^1[345789]{1}\\d{9}$"

	// 正则调用规则
	reg := regexp.MustCompile(regRuler)

	// 返回 MatchString 是否匹配
	return reg.MatchString(phone)

}

func CdnLocal(s string) string {
	if s == "" {
		return ""
	}
	if strings.Contains(s, "http") {
		return s
	}
	return global.Config.Server.BindUrl + s
}

func CdnUrl(s string) string {
	if s == "" {
		return ""
	}
	if strings.Contains(s, "http") {
		return s
	}
	z := global.Config.Server.BackendUrl
	return z + s
}

// Echo  格式化输出
func Echo(val ...any) {
	dump.P(val...)
}

func Echo2(val ...any) {
	pp.Println(val...)
}

// GetCode 获取随机字符串
// @m 字符串长度
// @t 类型，0=纯数字，1=纯字母，2=数字+字母，3=数字+小写字母+大写字母+特殊符号
func GetCode(m, t int) string {
	str := []byte("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+=-")
	zt := []int{9, 35, 56, len(str) - 1}
	c := make([]string, m)
	for i := 0; i < m; i++ {
		c = append(c, string(str[random.RandInt(0, zt[t])]))
	}
	return strings.Join(c, "")
}

// GetTreeMenu 获取无限级菜单
// @menuList 菜单列表
// @pid 父级id 一般为0
// @child 子级key
func GetAuthRuleTreeMenu(menuList []map[string]interface{}, pid int, child string) []map[string]interface{} {
	var treeList []map[string]interface{}
	for _, v := range menuList {
		if int(v["pid"].(int)) == pid {
			_child := GetAuthRuleTreeMenu(menuList, int(v["id"].(int)), child)
			node := map[string]interface{}{
				"id":     v["id"],
				"name":   v["name"],
				"title":  v["title"],
				"pid":    v["pid"],
				"select": false,
			}
			if len(_child) > 0 {
				node[child] = _child
			}
			treeList = append(treeList, node)
		}
	}
	return treeList
}
